package common.util;

import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Set;

@Component
public class RedisUtil {

    private static JedisPool pool = null;

    public static void main(String[] args) {
        Set<String> set = RedisUtil.keys("*");
        System.out.println(set.size());
        for (String str : set) {
            System.out.println(str);
        }
        Long total = delKeys(new String[]{"user1", "user2"});
        System.out.println(total);

        long total1 = delKeys("myKey");
        System.out.println("删除内容:" + total1);

        String[] array = set.toArray(new String[set.size()]);
        long total2 = delKeys(array);
        System.out.println("删除剩余数量:" + total2);
    }

    public static JedisPool getPool() {
        if (pool == null) {
            JedisPoolConfig config = new JedisPoolConfig();
            // 控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取；
            config.setBlockWhenExhausted(true);
            // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
            // 最大空闲数目
            config.setMaxIdle(25);
            // 设置超时时间
            config.setMaxWaitMillis(2000);
            // 最大连接数
            config.setMaxTotal(1000);
            // 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
            config.setTestOnBorrow(true);
            pool = new JedisPool(config, "localhost", 6379, 5000);
        }
        return pool;
    }


    private static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    private static Jedis getJedis() {
        return RedisUtil.getPool().getResource();
    }

    /**
     * 清空redis
     */
    public static void clearRedis() {
        Jedis jedis = getJedis();
        jedis.flushAll();
        close(jedis);
    }


    /**
     * 判断key是否存在
     *
     * @param key
     * @return
     */
    public static Boolean existsKey(String key) {
        Jedis jedis = getJedis();
        Boolean flag = jedis.exists(key);
        close(jedis);
        return flag;
    }

    /**
     * 通过key值取得对象
     *
     * @param key
     * @return
     */
    public static Object getObject(String key) {
        Jedis jedis = getJedis();
        Object obj = null;
        byte[] bytes = jedis.get(key.getBytes());
        if (bytes != null) {
            obj = ObjectUtil.deserialize(jedis.get(key.getBytes()));
        }
        close(jedis);
        return obj;
    }

    /**
     * 对对象进行数据存储6000秒
     *
     * @param key
     * @param value
     * @return
     */
    public static String saveObject(String key, Object value) {
        Jedis jedis = getJedis();
        String str = jedis.setex(key.getBytes(), 100000, ObjectUtil.serialize(value));
        close(jedis);
        return str;
    }

//    /**删除单个key*/
//    public static Boolean delKey(String key){
//        System.out.println("redis中需要清除的key:"+key);
//        boolean flag = false;
//        Jedis jedis = getJedis();
//        long total = jedis.del(key);
//        close(jedis);
//        if(total>0){
//            flag = true;
//        }
//        return flag;
//    }

    /**
     * 删除单个key
     */
    public static Long delKeys(String... keys) {
        Jedis jedis = getJedis();
        long total = jedis.del(keys);
        close(jedis);
        return total;
    }
//    /**
//     * 对对象进行数据存储6000秒
//     * @param key
//     * @param value
//     * @return
//     */
//    public static String saveObject2(String key, Object value) {
//        Jedis jedis = getJedis();
//        String str = jedis.setex(key.getBytes(), 100000, NativeSerializeUtil.serialize(value));
//        close(jedis);
//        return str;
//    }

    /*
     * 查找所有匹配模式的键
     *
     * key的查询表达式 *代表任意多个 ？代表一个
     */
    public static Set<String> keys(String pattern) {
        Jedis jedis = getJedis();
        Set<String> set = jedis.keys(pattern);
        close(jedis);
        return set;
    }

    public static void resetExpire(String key, int expireTime) {
        Jedis jedis = getJedis();
        jedis.expire(key, expireTime);
        close(jedis);
    }

}